#ifndef __M_LOG_H__
#define __M_LOG_H__
#include <iostream>
#include <ctime>  // 用于获取时间

namespace bitmq
{
// ========== 日志级别常量定义 ==========
#define DBG_LEVEL 0  // 调试级别（最低级别）
#define INF_LEVEL 1  // 信息级别
#define ERR_LEVEL 2  // 错误级别（最高级别）

// 默认日志输出级别（当前设置为调试级别）
#define DEFAULT_LEVEL DBG_LEVEL

// ========== 核心日志宏 ==========
/**
 * @brief 通用日志输出宏
 * @param lev_str 日志级别字符串标识（如 "DBG"）
 * @param level 当前日志的级别数值
 * @param format 格式化字符串（类似printf）
 * @param ... 可变参数（对应格式化字符串中的占位符）
 * 
 * 实现特性：
 * 1. 级别过滤：只有不低于DEFAULT_LEVEL的日志才会输出
 * 2. 自动获取时间：精确到时分秒
 * 3. 自动记录位置：输出文件名和行号
 * 4. 使用##__VA_ARGS__处理空参数情况（GCC/Clang扩展）
 */
#define LOG(lev_str, level, format, ...) {\
    if (level >= DEFAULT_LEVEL) {\
        time_t t = time(nullptr);                     /* 获取当前时间戳 */ \
        struct tm* ptm = localtime(&t);               /* 转换为本地时间 */ \
        char time_str[32];                            /* 时间格式化缓冲区 */ \
        strftime(time_str, 31, "%H:%M:%S", ptm);      /* 格式化为"时:分:秒" */ \
        /* 输出格式：[级别][时间][文件名:行号] 用户日志 */ \
        printf("[%s][%s][%s:%d]\t" format "\n",       \
            lev_str, time_str, __FILE__, __LINE__,    \
            ##__VA_ARGS__);                           /* 处理可变参数 */ \
    }\
}

// ========== 具体日志级别封装宏 ==========
// 调试日志（DBG_LEVEL）
#define DLOG(format, ...) LOG("DBG", DBG_LEVEL, format, ##__VA_ARGS__)
// 信息日志（INF_LEVEL）
#define ILOG(format, ...) LOG("INF", INF_LEVEL, format, ##__VA_ARGS__)
// 错误日志（ERR_LEVEL）
#define ELOG(format, ...) LOG("ERR", ERR_LEVEL, format, ##__VA_ARGS__)
}
#endif